﻿namespace WSBancoIdeal
{
    using System;
    using System.Collections.Generic;
    using System.Data.Objects;
    using System.Linq;
    using System.Web.Script.Serialization;
    using System.Web.Script.Services;
    using System.Web.Services;
    using BancoIdeal.WS;
    using Data;

    /// <summary>
    /// Summary description for Productos
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class Productos : System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetProductosCaptacion(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var productos = (from c in bd.ProductosClientes
                                 where c.idCliente == idCliente && c.Producto.TipoProducto.idTipoProducto == 2
                                 select new ProductoWS
                                 {
                                     IdProductoCliente = c.idProductoCliente,
                                     NumeroDelProducto = c.NumeroDelProducto,
                                     IdOficina = c.idOficina,
                                     IdProducto = c.idProducto,
                                     IdCliente = c.idCliente,
                                     NombreProductoCliente = c.NombreProductoCliente,
                                     TasaInteres = c.TasaInteres,
                                     Periodos = c.Periodos,
                                     TipoPeriodo = c.TipoPeriodo,
                                     Descripcion = c.Producto.Descripcion,
                                     NombreProducto = c.Producto.NombreProducto,
                                     NombreTipoProducto = c.Producto.TipoProducto.TipoProducto1,
                                     IdGrupoCliente = c.idGrupoCliente,
                                     FechaCreacion = c.FechaCreacion,
                                     FechaFin = EntityFunctions.AddMonths(c.FechaCreacion, c.Periodos),
                                     SaldoD = (from r in bd.Movimientos
                                               where r.idProductoCliente == c.idProductoCliente
                                               group r by r.idProductoCliente into g
                                               select new
                                               {
                                                   Saldo = g.Sum(k => k.Debito - k.Credito)
                                               }).FirstOrDefault().Saldo
                                 }).ToList();
                productos.ForEach(a => a.Saldo = a.SaldoD == null ? string.Empty : a.SaldoD.Value.ToString("#,##0.##"));
                return new JavaScriptSerializer().Serialize(productos);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetProductosColocacionPagar(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var productos = (from c in bd.ProductosClientes
                                 where c.idCliente == idCliente && c.Producto.TipoProducto.idTipoProducto == 1
                                 select new ProductoWS
                                 {
                                     IdProductoCliente = c.idProductoCliente,
                                     NumeroDelProducto = c.NumeroDelProducto,
                                     IdOficina = c.idOficina,
                                     IdProducto = c.idProducto,
                                     IdCliente = c.idCliente,
                                     NombreProductoCliente = c.NombreProductoCliente,
                                     TasaInteres = c.TasaInteres,
                                     Periodos = c.Periodos,
                                     TipoPeriodo = c.TipoPeriodo,
                                     Descripcion = c.Producto.Descripcion,
                                     NombreProducto = c.Producto.NombreProducto,
                                     NombreTipoProducto = c.Producto.TipoProducto.TipoProducto1,
                                     IdGrupoCliente = c.idGrupoCliente,
                                     FechaCreacion = c.FechaCreacion,
                                     FechaFin = EntityFunctions.AddMonths(c.FechaCreacion, c.Periodos),
                                     ValorAprobado = c.valorAprobado,
                                     SaldoD = (from r in bd.Movimientos
                                               where r.idProductoCliente == c.idProductoCliente
                                               group r by r.idProductoCliente into g
                                               select new
                                               {
                                                   Saldo = g.Sum(k => k.Debito - k.Credito)
                                               }).FirstOrDefault().Saldo,
                                     FechaUltimoPago = c.Movimientos.Max(x => x.FechaMovimiento)
                                 }).ToList();
                productos.ForEach(a =>
                {
                    decimal cup = GetCupoDisponibleDecimal(a.IdProductoCliente);
                    a.CupoDisponible = cup.ToString("#,##0.##");
                    a.Saldo = a.SaldoD == null ? string.Empty : a.SaldoD.Value.ToString("#,##0.##");
                    a.ValorAprobadoCadena = a.ValorAprobado == null ? string.Empty : a.ValorAprobado.Value.ToString("#,##0.##");
                    a.DiasMora = GetDiasDeMoraIntero(a.IdProductoCliente);
                    if (a.ValorAprobado != null && cup < a.ValorAprobado.Value)
                    {
                        a.ValorPago = GetCuota(a.IdProductoCliente);
                        a.ValorDeuda = (a.ValorAprobado.Value - cup);
                        a.Cuota = a.ValorPago.ToString("#,##0.##");

                    }
                    else
                    {
                        a.ValorDeuda = 0;
                        a.Cuota = "0";
                        a.ValorPago = 0;
                    }

                });
                return new JavaScriptSerializer().Serialize(productos.FindAll(t => t.FechaUltimoPago == null || t.FechaUltimoPago.Value.Date < DateTime.Now.Date));
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetProductosColocacion(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var productos = (from c in bd.ProductosClientes
                                 where c.idCliente == idCliente && c.Producto.TipoProducto.idTipoProducto == 1
                                 select new ProductoWS
                                 {
                                     IdProductoCliente = c.idProductoCliente,
                                     NumeroDelProducto = c.NumeroDelProducto,
                                     IdOficina = c.idOficina,
                                     IdProducto = c.idProducto,
                                     IdCliente = c.idCliente,
                                     NombreProductoCliente = c.NombreProductoCliente,
                                     TasaInteres = c.TasaInteres,
                                     Periodos = c.Periodos,
                                     TipoPeriodo = c.TipoPeriodo,
                                     Descripcion = c.Producto.Descripcion,
                                     NombreProducto = c.Producto.NombreProducto,
                                     NombreTipoProducto = c.Producto.TipoProducto.TipoProducto1,
                                     IdGrupoCliente = c.idGrupoCliente,
                                     FechaCreacion = c.FechaCreacion,
                                     FechaFin = EntityFunctions.AddMonths(c.FechaCreacion, c.Periodos),
                                     ValorAprobado = c.valorAprobado,
                                     SaldoD = (from r in bd.Movimientos
                                               where r.idProductoCliente == c.idProductoCliente
                                               group r by r.idProductoCliente into g
                                               select new
                                               {
                                                   Saldo = g.Sum(k => k.Debito - k.Credito)
                                               }).FirstOrDefault().Saldo
                                 }).ToList();
                productos.ForEach(a =>
                {
                    decimal cup = GetCupoDisponibleDecimal(a.IdProductoCliente);
                    a.CupoDisponible = cup.ToString("#,##0.##");
                    a.Saldo = a.SaldoD == null ? string.Empty : a.SaldoD.Value.ToString("#,##0.##");
                    a.ValorAprobadoCadena = a.ValorAprobado == null ? string.Empty : a.ValorAprobado.Value.ToString("#,##0.##");
                    a.DiasMora = GetDiasDeMoraIntero(a.IdProductoCliente);
                    if (a.ValorAprobado != null && cup < a.ValorAprobado.Value)
                    {
                        a.ValorDeuda = (a.ValorAprobado.Value - cup);
                        a.Cuota = GetCuota(a.IdProductoCliente).ToString("#,##0.##");
                    }
                    else
                    {
                        a.ValorDeuda = 0;
                        a.Cuota = "0";
                    }

                });
                return new JavaScriptSerializer().Serialize(productos);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string CrearCuentaAhorros(
             int idCliente,
             int idOficina,
             decimal valor,
             string NombreProductoCliente,
             int idProductoOrigen)
        {
            try
            {
                ProductosCliente prod = new ProductosCliente();
                prod.idCliente = idCliente;
                prod.idOficina = idOficina;
                prod.idProducto = 1;
                prod.TasaInteres = 0;
                prod.Periodos = 0;
                prod.FechaCreacion = DateTime.Now;
                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    if (string.IsNullOrWhiteSpace(NombreProductoCliente))
                    {
                        prod.NombreProductoCliente = (from c in bd.Productos
                                                      where c.idProducto == 1
                                                      select c.NombreProducto).Single();
                    }
                    else
                    {
                        prod.NombreProductoCliente = NombreProductoCliente;
                    }
                    prod.TasaInteres = (from c in bd.Productos
                                        where c.idProducto == 1
                                        select c.TasaInteres).Single();

                    bd.ProductosClientes.AddObject(prod);
                    prod.NumeroDelProducto = Convert.ToDecimal(prod.Oficina.Ciudad + prod.idCliente + prod.idProducto + prod.idProductoCliente);
                    bd.SaveChanges();
                }

                if (idProductoOrigen > 0)
                {
                    TransfereciaEntreCuentas(idProductoOrigen, prod.idProductoCliente, valor);
                }
                else
                {
                    Consignar(prod.idProductoCliente, valor, "Apertura de cuenta de ahorros", 1);
                }

                return new JavaScriptSerializer().Serialize(prod.idProductoCliente.ToString());
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string CrearCuentaCorriente(int idCliente, int idOficina, decimal valor, string NombreProductoCliente, int idProductoOrigen)
        {
            try
            {
                ProductosCliente prod = new ProductosCliente();
                prod.idCliente = idCliente;
                prod.idOficina = idOficina;
                prod.idProducto = 2;
                prod.TasaInteres = 0;
                prod.Periodos = 0;
                prod.FechaCreacion = DateTime.Now;

                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    if (string.IsNullOrWhiteSpace(NombreProductoCliente))
                    {
                        prod.NombreProductoCliente = (from c in bd.Productos
                                                      where c.idProducto == 2
                                                      select c.NombreProducto).Single();
                    }
                    else
                    {
                        prod.NombreProductoCliente = NombreProductoCliente;
                    }
                    prod.TasaInteres = (from c in bd.Productos
                                        where c.idProducto == 2
                                        select c.TasaInteres).Single();

                    bd.ProductosClientes.AddObject(prod);
                    prod.NumeroDelProducto = Convert.ToDecimal(prod.Oficina.Ciudad + prod.idCliente + prod.idProducto + prod.idProductoCliente);
                    bd.SaveChanges();
                }

                if (idProductoOrigen > 0)
                {
                    TransfereciaEntreCuentas(idProductoOrigen, prod.idProductoCliente, valor);
                }
                else
                {
                    Consignar(prod.idProductoCliente, valor, "Apertura de cuenta corriente", 1);
                }


                return new JavaScriptSerializer().Serialize(prod.idProductoCliente.ToString());
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string CrearCDT(int idCliente, int idOficina, decimal TasaInteres, int Periodos, decimal valor, string NombreProductoCliente, int idProductoOrigen)
        {
            try
            {
                ProductosCliente prod = new ProductosCliente();
                prod.idCliente = idCliente;
                prod.idOficina = idOficina;
                prod.idProducto = 6;
                prod.TasaInteres = TasaInteres;
                prod.Periodos = Periodos;
                prod.FechaCreacion = DateTime.Now;
                string nombreProducto;
                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    var Nomproduct = (from c in bd.Productos
                                      where c.idProducto == 6
                                      select c.NombreProducto).Single();
                    if (string.IsNullOrWhiteSpace(NombreProductoCliente))
                    {
                        prod.NombreProductoCliente = Nomproduct;
                    }
                    else
                    {
                        prod.NombreProductoCliente = NombreProductoCliente;
                    }

                    bd.ProductosClientes.AddObject(prod);
                    prod.NumeroDelProducto = Convert.ToDecimal(prod.Oficina.Ciudad + prod.idCliente + prod.idProducto + prod.idProductoCliente);
                    bd.SaveChanges();

                    nombreProducto = Nomproduct;
                }

                if (idProductoOrigen > 0)
                {
                    TransfereciaEntreCuentas(idProductoOrigen, prod.idProductoCliente, valor);
                }
                else
                {
                    Consignar(prod.idProductoCliente, valor, "Apertura de " + nombreProducto, 1);
                }

                return new JavaScriptSerializer().Serialize(prod.idProductoCliente.ToString());
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string ConsignacionEnEfectivo(int idProductoCliente, decimal valor)
        {
            string result = Consignar(idProductoCliente, valor, "Efectivo", 1);
            return new JavaScriptSerializer().Serialize(result);
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string ConsignacionEnCheque(int idProductoCliente, decimal valor, string NumeroCheque)
        {
            string result = Consignar(idProductoCliente, valor, "Cheque No. " + NumeroCheque, 2);
            return new JavaScriptSerializer().Serialize(result);
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string SaldoCuenta(int idProductoCliente)
        {
            string saldo = SaldoProductoCliente(idProductoCliente).ToString("#,##0.##");
            return new JavaScriptSerializer().Serialize(saldo);
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string SaldosCuentas(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                decimal? saldos;
                var suma = from m in bd.Movimientos
                           join p in bd.ProductosClientes
                               on m.idProductoCliente equals p.idProductoCliente
                           where p.idCliente == idCliente && (p.idProducto == 2 || p.idProducto == 1)
                           group m by p.idCliente into g
                           select new
                           {
                               Saldo = g.Sum(k => k.Debito - k.Credito)
                           };
                if (suma.Count() > 0)
                {
                    saldos = suma.FirstOrDefault().Saldo;
                    saldos = saldos == null ? 0 : saldos;
                }
                else
                {
                    saldos = 0;
                }

                return new JavaScriptSerializer().Serialize(saldos.Value.ToString("#,##0.##"));
            }
        }

        public static decimal SaldoProductoCliente(int idProductoCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = from c in bd.Movimientos
                        where c.idProductoCliente == idProductoCliente
                        select new
                        {
                            saldo = c.Debito - c.Credito
                        };
                if (a.Count() == 0)
                {
                    return Convert.ToDecimal(0);
                }
                else
                {
                    decimal b = (decimal)a.Sum(x => x.saldo);
                    return Convert.ToDecimal(b);
                }
            }
        }

        public static bool Retirar(int idProductoCliente, decimal valor, string Detalle, out string Respuesta, short TipoMovimiento)
        {
            bool estado = false;
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                decimal a = SaldoProductoCliente(idProductoCliente);
                if (valor > a)
                {
                    Respuesta = "No tiene saldo suficiente";
                    estado = false;
                }
                else
                {
                    string resultado = AddMovimiento(idProductoCliente, valor, "Retiro - " + Detalle, -1, TipoMovimiento);
                    if (resultado == "Success")
                    {
                        Respuesta = "Se ha efectuado el retiro";
                        estado = true;
                    }
                    else
                    {
                        Respuesta = "No se realizó el retiro - Detalles:" + resultado;
                        estado = false;
                    }
                }
            }

            return estado;
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string RetirarDeCuenta(int idProductoCliente, decimal valor, string Detalle)
        {
            ////verificar que tenga saldo disponible
            ////si tiene saldo disponible autorizar el retiro
            string respuesta = "No se pudo realizar la operación";
            bool estado = Retirar(idProductoCliente, valor, Detalle, out respuesta, 5);
            return new JavaScriptSerializer().Serialize(respuesta);
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string TransfereciaEntreCuentas(int idProductoClienteOrigen, int idProductoClienteDestino, decimal valor)
        {
            string Respuesta;
            if (idProductoClienteOrigen == idProductoClienteDestino)
            {
                Respuesta = "La cuenta de origen y de destino son iguales";
            }
            else
            {
                bool estado = Retirar(idProductoClienteOrigen, valor, "Retiro por transferencia", out Respuesta, 9);
                if (estado == true)
                {
                    string result = Consignar(idProductoClienteDestino, valor, "Abono por transferencia", 3);
                    Respuesta = "Success";
                }
            }

            return new JavaScriptSerializer().Serialize(Respuesta);
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string TransfereciaOtrosBancos(int idProductoClienteOrigen, decimal valor, string descripcion)
        {
            string Respuesta = string.Empty;
            {
                bool estado = Retirar(idProductoClienteOrigen, valor, descripcion, out Respuesta, 9);
                if (estado == true)
                {
                    Respuesta = "Success";
                }
            }

            return new JavaScriptSerializer().Serialize(Respuesta);
        }

        /// <summary>
        /// Adiciona movimientos a una cuenta
        /// </summary>
        /// <param name="idProductoCliente">identificador del producto del cliente</param>
        /// <param name="valor"> Valor a causar</param>
        /// <param name="Detalle">Detalle de la operacion</param>
        /// <param name="direccion">-1 para credito, 1 para débito</param>
        /// <returns></returns>
        public static string AddMovimiento(int idProductoCliente, decimal valor, string Detalle, int direccion, short TipoMovimiento)
        {
            try
            {
                Movimiento mov = new Movimiento();
                mov.FechaMovimiento = DateTime.Now;
                mov.idProductoCliente = idProductoCliente;
                mov.TipoMovimiento = TipoMovimiento;
                mov.Detalle = Detalle;
                if (direccion > 0)
                {
                    mov.Debito = valor;
                    mov.Credito = 0;
                }
                else
                {
                    mov.Credito = valor;
                    mov.Debito = 0;
                }

                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    bd.Movimientos.AddObject(mov);
                    bd.SaveChanges();
                }

                return "Success";
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        /// <summary>
        /// Adiciona movimientos a una cuenta
        /// </summary>
        /// <param name="idProductoCliente">identificador del producto del cliente</param>
        /// <param name="valor"> Valor a causar</param>
        /// <param name="Detalle">Detalle de la operacion</param>
        /// <param name="direccion">-1 para credito, 1 para débito</param>
        /// <returns></returns>
        public static string AddMovimiento(int idProductoCliente, decimal valor, string Detalle, int direccion, short TipoMovimiento, DateTime fecha)
        {
            try
            {
                Movimiento mov = new Movimiento();
                mov.FechaMovimiento = fecha;
                mov.idProductoCliente = idProductoCliente;
                mov.TipoMovimiento = TipoMovimiento;
                mov.Detalle = Detalle;
                if (direccion > 0)
                {
                    mov.Debito = valor;
                    mov.Credito = 0;
                }
                else
                {
                    mov.Credito = valor;
                    mov.Debito = 0;
                }

                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    bd.Movimientos.AddObject(mov);
                    bd.SaveChanges();
                }

                return "Success";
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        public static string Consignar(int idProductoCliente, decimal valor, string Detalle, short TipoMovimiento)
        {
            return AddMovimiento(idProductoCliente, valor, "Consignacion - " + Detalle, 1, TipoMovimiento);
        }

        /// <summary>
        /// Crea un producto asociado al cliente
        /// </summary>
        /// <param name="idCliente">Identificador del cliente </param>
        /// <param name="idOficina">Idnetificador de la oficina: 1 para virtual</param>
        /// <param name="idProducto">Identificador del prodocuto</param>
        /// <param name="TasaInteres">Tasa de interese desde cero hasta uno con dos decimales</param>
        /// <param name="Periodos">Entero con el número de periodos a los que se crea un producto, cero para cuando el producto no tiene vencimiento</param>
        /// <param name="valor">Decimal con el valor a consignar en el producto </param>
        /// <returns></returns>
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string CrearProductoCliente(int idCliente, int idOficina, int idProducto, decimal TasaInteres, int Periodos, decimal valor, string nombreProducto)
        {
            try
            {
                ProductosCliente prod = new ProductosCliente();
                prod.idCliente = idCliente;
                prod.idOficina = idOficina;
                prod.idProducto = idProducto;
                prod.TasaInteres = TasaInteres;
                prod.Periodos = Periodos;
                prod.FechaCreacion = DateTime.Now;
                string nombreStandarProducto;
                int direccionProducto;
                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    if (string.IsNullOrWhiteSpace(nombreProducto))
                    {
                        prod.NombreProductoCliente = (from c in bd.Productos
                                                      where c.idProducto == 1
                                                      select c.NombreProducto).Single();
                    }
                    else
                    {
                        prod.NombreProductoCliente = nombreProducto;
                    }

                    bd.ProductosClientes.AddObject(prod);
                    prod.NumeroDelProducto = Convert.ToDecimal(prod.Oficina.Ciudad + prod.idCliente + prod.idProducto + prod.idProductoCliente);


                    var Nomproduct = (from c in bd.Productos
                                      where c.idProducto == idProducto
                                      select c).Single();
                    nombreStandarProducto = Nomproduct.NombreProducto;
                    direccionProducto = Nomproduct.TipoProducto.Direccion;
                    if (!string.IsNullOrEmpty(nombreProducto))
                    {
                        nombreProducto = ": " + nombreProducto;
                    }
                    if (direccionProducto < 0)
                    {
                        prod.valorAprobado = valor;
                    }
                    bd.SaveChanges();
                }


                if (idProducto < 8 || idProducto > 12)
                {
                    string resultConsignacion = AddMovimiento(prod.idProductoCliente, valor, "Apertura de " + nombreStandarProducto + nombreProducto, direccionProducto, 1);
                }


                //string resultConsignacion = Consignar(prod.idProductoCliente, valor, "Apertura de " + nombreStandarProducto + nombreProducto, 1);
                return new JavaScriptSerializer().Serialize(prod.idProductoCliente.ToString());
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string PersonalizarProducto(int idProductoCliente, string NombreProducto)
        {
            try
            {
                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    var a = (from c in bd.ProductosClientes
                             where c.idProductoCliente == idProductoCliente
                             select c).Single();

                    a.NombreProductoCliente = NombreProducto;
                    bd.SaveChanges();
                }

                return new JavaScriptSerializer().Serialize("Success");
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string CrearClienteGrupo(int idCliente, string NombreGrupo, string descripcion)
        {
            try
            {
                GruposCliente grp = new GruposCliente();
                grp.idCliente = idCliente;
                grp.NombreDelGrupo = NombreGrupo;
                grp.Descripcion = descripcion;

                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    bd.GruposClientes.AddObject(grp);
                    bd.SaveChanges();
                }

                return new JavaScriptSerializer().Serialize(grp.idGrupoCliente);
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string EliminarClienteFactura(int idFacturaCliente)
        {
            try
            {
                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    var grp = (from c in bd.FacturasClientes
                               where c.idFacturaCliente == idFacturaCliente
                               select c).Single();


                    bd.FacturasClientes.DeleteObject(grp);
                    bd.SaveChanges();
                }

                return new JavaScriptSerializer().Serialize("Success");
            }
            catch (Exception e)
            {
                return new JavaScriptSerializer().Serialize(e.Message);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string EliminarClienteGrupo(int idGrupoCliente)
        {
            try
            {
                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    //actualizar los productos al grupo inicial

                    var ptos = from c in bd.ProductosClientes
                               where c.idGrupoCliente == idGrupoCliente
                               select c;

                    foreach (var item in ptos)
                    {
                        item.idGrupoCliente = null;
                    }

                    var grp = (from c in bd.GruposClientes
                               where c.idGrupoCliente == idGrupoCliente
                               select c).Single();

                    var das = (from c in bd.ConfiguracionDashboards
                               where c.idProductoCliente == idGrupoCliente && c.TipoCuenta == "2"
                               select c).SingleOrDefault();

                    bd.GruposClientes.DeleteObject(grp);
                    if (das != null)
                    {
                        bd.ConfiguracionDashboards.DeleteObject(das);
                    }                    
                    bd.SaveChanges();
                }

                return new JavaScriptSerializer().Serialize("Success");
            }
            catch (Exception e)
            {
                return new JavaScriptSerializer().Serialize(e.Message);
            }
        }


        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string EditarClienteGrupo(int idGrupoCliente, string NuevoNombreGrupo, string Nuevadescripcion)
        {
            try
            {
                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    var grp = (from c in bd.GruposClientes
                               where c.idGrupoCliente == idGrupoCliente
                               select c).Single();

                    grp.NombreDelGrupo = NuevoNombreGrupo;
                    grp.Descripcion = Nuevadescripcion;

                    bd.SaveChanges();
                }

                return new JavaScriptSerializer().Serialize("success");
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string AgruparProducto(int idProductoCliente, int idGrupoCliente)
        {
            try
            {
                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    var a = (from c in bd.ProductosClientes
                             where c.idProductoCliente == idProductoCliente
                             select c).Single();

                    a.idGrupoCliente = idGrupoCliente;
                    bd.SaveChanges();
                }

                return new JavaScriptSerializer().Serialize("Success");
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetGruposCliente(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.GruposClientes
                         where c.idCliente == idCliente
                         select new
                         {
                             c.NombreDelGrupo,
                             c.idGrupoCliente,
                             c.Descripcion,
                             c.idCliente
                         }).ToList();
                return new JavaScriptSerializer().Serialize(a);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetGruposClienteFull(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var productos = (from r in bd.GruposClientes
                                 where r.idCliente == idCliente
                                 select new GrupoWS
                                 {
                                     NombreDelGrupo = r.NombreDelGrupo,
                                     IdGrupoCliente = r.idGrupoCliente,
                                     Descripcion = r.Descripcion,
                                     IdCliente = r.idCliente,
                                     Produc = from c in bd.ProductosClientes
                                              where c.idGrupoCliente == r.idGrupoCliente
                                              select new ProductoWS
                                              {
                                                  IdProductoCliente = c.idProductoCliente,
                                                  NumeroDelProducto = c.NumeroDelProducto,
                                                  IdOficina = c.idOficina,
                                                  IdProducto = c.idProducto,
                                                  IdCliente = c.idCliente,
                                                  NombreProductoCliente = c.NombreProductoCliente,
                                                  TasaInteres = c.TasaInteres,
                                                  Periodos = c.Periodos,
                                                  TipoPeriodo = c.TipoPeriodo,
                                                  Descripcion = c.Producto.Descripcion,
                                                  NombreProducto = c.Producto.NombreProducto,
                                                  NombreTipoProducto = c.Producto.TipoProducto.TipoProducto1,
                                                  IdGrupoCliente = c.idGrupoCliente,
                                                  FechaCreacion = c.FechaCreacion,
                                                  FechaFin = EntityFunctions.AddMonths(c.FechaCreacion, c.Periodos),
                                                  ValorAprobado = c.valorAprobado,
                                                  SaldoD = (from y in bd.Movimientos
                                                            where y.idProductoCliente == c.idProductoCliente
                                                            group y by y.idProductoCliente into g
                                                            select new
                                                            {
                                                                Saldo = g.Sum(k => k.Debito - k.Credito)
                                                            }).FirstOrDefault().Saldo
                                              }
                                 }).ToList();

                var productosSinOrdenar = (from c in bd.ProductosClientes
                                           where c.idGrupoCliente == null && c.idCliente == idCliente
                                           select new ProductoWS
                                           {
                                               IdProductoCliente = c.idProductoCliente,
                                               NumeroDelProducto = c.NumeroDelProducto,
                                               IdOficina = c.idOficina,
                                               IdProducto = c.idProducto,
                                               IdCliente = c.idCliente,
                                               NombreProductoCliente = c.NombreProductoCliente,
                                               TasaInteres = c.TasaInteres,
                                               Periodos = c.Periodos,
                                               TipoPeriodo = c.TipoPeriodo,
                                               Descripcion = c.Producto.Descripcion,
                                               NombreProducto = c.Producto.NombreProducto,
                                               NombreTipoProducto = c.Producto.TipoProducto.TipoProducto1,
                                               IdGrupoCliente = c.idGrupoCliente,
                                               FechaCreacion = c.FechaCreacion,
                                               FechaFin = EntityFunctions.AddMonths(c.FechaCreacion, c.Periodos),
                                               ValorAprobado = c.valorAprobado,
                                               SaldoD = (from r in bd.Movimientos
                                                         where r.idProductoCliente == c.idProductoCliente
                                                         group r by r.idProductoCliente into g
                                                         select new
                                                         {
                                                             Saldo = g.Sum(k => k.Debito - k.Credito)
                                                         }).FirstOrDefault().Saldo
                                           }).ToList();
                if (productosSinOrdenar.Count() > 0)
                {
                    GrupoWS tmp = new GrupoWS();
                    tmp.Descripcion = "Sin organizar";
                    tmp.IdCliente = idCliente;
                    tmp.IdGrupoCliente = -1;
                    tmp.NombreDelGrupo = "Sin organizar";
                    productosSinOrdenar.ToList().ForEach(a =>

                        a.Saldo = a.SaldoD == null ? string.Empty : a.SaldoD.Value.ToString("#,##0.##")
                    );
                    tmp.Produc = productosSinOrdenar.AsQueryable();
                    productos.Add(tmp);
                }

                productos.ForEach(x => x.Produc.ToList().ForEach(a =>

                    a.Saldo = a.SaldoD == null ? string.Empty : a.SaldoD.Value.ToString("#,##0.##")
                ));
                return new JavaScriptSerializer().Serialize(productos);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetGruposClienteFullCreditos(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var productos = (from r in bd.GruposClientes
                                 where r.idCliente == idCliente
                                 select new GrupoWS
                                 {
                                     NombreDelGrupo = r.NombreDelGrupo,
                                     IdGrupoCliente = r.idGrupoCliente,
                                     Descripcion = r.Descripcion,
                                     IdCliente = r.idCliente,
                                     Produc = from c in bd.ProductosClientes
                                              where c.idGrupoCliente == r.idGrupoCliente
                                              select new ProductoWS
                                              {
                                                  IdProductoCliente = c.idProductoCliente,
                                                  NumeroDelProducto = c.NumeroDelProducto,
                                                  IdOficina = c.idOficina,
                                                  IdProducto = c.idProducto,
                                                  IdCliente = c.idCliente,
                                                  NombreProductoCliente = c.NombreProductoCliente,
                                                  TasaInteres = c.TasaInteres,
                                                  Periodos = c.Periodos,
                                                  TipoPeriodo = c.TipoPeriodo,
                                                  Descripcion = c.Producto.Descripcion,
                                                  NombreProducto = c.Producto.NombreProducto,
                                                  NombreTipoProducto = c.Producto.TipoProducto.TipoProducto1,
                                                  IdGrupoCliente = c.idGrupoCliente,
                                                  FechaCreacion = c.FechaCreacion,
                                                  FechaFin = EntityFunctions.AddMonths(c.FechaCreacion, c.Periodos),
                                                  ValorAprobado = c.valorAprobado,
                                                  SaldoD = (from y in bd.Movimientos
                                                            where y.idProductoCliente == c.idProductoCliente
                                                            group y by y.idProductoCliente into g
                                                            select new
                                                            {
                                                                Saldo = g.Sum(k => k.Debito - k.Credito)
                                                            }).FirstOrDefault().Saldo
                                              }
                                 }).ToList();

                var productosSinOrdenar = (from c in bd.ProductosClientes
                                           where c.idGrupoCliente == null && c.idCliente == idCliente
                                           select new ProductoWS
                                           {
                                               IdProductoCliente = c.idProductoCliente,
                                               NumeroDelProducto = c.NumeroDelProducto,
                                               IdOficina = c.idOficina,
                                               IdProducto = c.idProducto,
                                               IdCliente = c.idCliente,
                                               NombreProductoCliente = c.NombreProductoCliente,
                                               TasaInteres = c.TasaInteres,
                                               Periodos = c.Periodos,
                                               TipoPeriodo = c.TipoPeriodo,
                                               Descripcion = c.Producto.Descripcion,
                                               NombreProducto = c.Producto.NombreProducto,
                                               NombreTipoProducto = c.Producto.TipoProducto.TipoProducto1,
                                               IdGrupoCliente = c.idGrupoCliente,
                                               FechaCreacion = c.FechaCreacion,
                                               FechaFin = EntityFunctions.AddMonths(c.FechaCreacion, c.Periodos),
                                               ValorAprobado = c.valorAprobado,
                                               SaldoD = (from r in bd.Movimientos
                                                         where r.idProductoCliente == c.idProductoCliente
                                                         group r by r.idProductoCliente into g
                                                         select new
                                                         {
                                                             Saldo = g.Sum(k => k.Debito - k.Credito)
                                                         }).FirstOrDefault().Saldo
                                           }).ToList();
                if (productosSinOrdenar.Count() > 0)
                {
                    GrupoWS tmp = new GrupoWS();
                    tmp.Descripcion = "Sin organizar";
                    tmp.IdCliente = idCliente;
                    tmp.IdGrupoCliente = -1;
                    tmp.NombreDelGrupo = "Sin organizar";
                    productosSinOrdenar.ToList().ForEach(a =>
                {
                    if (a.IdProducto > 9 || a.IdProducto == 3 || a.IdProducto == 4 || a.IdProducto == 5)
                    {
                        a.ValorAprobadoCadena = a.ValorAprobado == null ? string.Empty : a.ValorAprobado.Value.ToString("#,##0.##");
                        a.DiasMora = GetDiasDeMoraIntero(a.IdProductoCliente);
                        a.Cuota = GetCuota(a.IdProductoCliente).ToString("#,##0.##");
                        a.Saldo = a.SaldoD == null ? string.Empty : a.SaldoD.Value.ToString("#,##0.##");
                    }
                });
                    tmp.Produc = productosSinOrdenar.AsQueryable();
                    productos.Add(tmp);
                }

                productos.ForEach(x => x.Produc.ToList().ForEach(a =>
                {
                    if (a.IdProducto > 9 || a.IdProducto == 3 || a.IdProducto == 4 || a.IdProducto == 5)
                    {
                        a.ValorAprobadoCadena = a.ValorAprobado == null ? string.Empty : a.ValorAprobado.Value.ToString("#,##0.##");
                        a.DiasMora = GetDiasDeMoraIntero(a.IdProductoCliente);
                        a.Cuota = GetCuota(a.IdProductoCliente).ToString("#,##0.##");
                        a.Saldo = a.SaldoD == null ? string.Empty : a.SaldoD.Value.ToString("#,##0.##");
                    }
                }));
                return new JavaScriptSerializer().Serialize(productos);
            }
        }


        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetProductosXGrupo(int idGrupoCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var productos = (from c in bd.ProductosClientes
                                 where c.idGrupoCliente == idGrupoCliente
                                 select new ProductoWS
                                 {
                                     IdProductoCliente = c.idProductoCliente,
                                     NumeroDelProducto = c.NumeroDelProducto,
                                     IdOficina = c.idOficina,
                                     IdProducto = c.idProducto,
                                     IdCliente = c.idCliente,
                                     NombreProductoCliente = c.NombreProductoCliente,
                                     TasaInteres = c.TasaInteres,
                                     Periodos = c.Periodos,
                                     TipoPeriodo = c.TipoPeriodo,
                                     Descripcion = c.Producto.Descripcion,
                                     NombreProducto = c.Producto.NombreProducto,
                                     NombreTipoProducto = c.Producto.TipoProducto.TipoProducto1,
                                     IdGrupoCliente = c.idGrupoCliente,
                                     FechaCreacion = c.FechaCreacion,
                                     FechaFin = EntityFunctions.AddMonths(c.FechaCreacion, c.Periodos),
                                     SaldoD = (from r in bd.Movimientos
                                               where r.idProductoCliente == c.idProductoCliente
                                               group r by r.idProductoCliente into g
                                               select new
                                               {
                                                   Saldo = g.Sum(k => k.Debito - k.Credito)
                                               }).FirstOrDefault().Saldo
                                 }).ToList();
                productos.ForEach(a => a.Saldo = a.SaldoD == null ? string.Empty : a.SaldoD.Value.ToString("#,##0.##"));
                return new JavaScriptSerializer().Serialize(productos);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetMovimientoXProducto(int idProductoCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.Movimientos
                         where c.idProductoCliente == idProductoCliente
                         select new
                         {
                             c.Credito,
                             c.Debito,
                             c.Detalle,
                             c.FechaMovimiento,
                             c.idMovmiento,
                             c.idProductoCliente,
                             c.TipoMovimiento
                         }).ToList();

                return new JavaScriptSerializer().Serialize(a);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetMoviemintosXTipoMovimiento(int idProductoCliente, short TipoMovimiento)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = from c in bd.Movimientos
                        where c.idProductoCliente == idProductoCliente && c.TipoMovimiento == TipoMovimiento
                        select new
                        {
                            ValorRendimiento = c.Debito - c.Credito,
                            FechaMovimiento = c.FechaMovimiento,
                        };

                return new JavaScriptSerializer().Serialize(a);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetRendimientos(int idProductoCliente)
        {
            //CalcularRendimientos(idProductoCliente);

            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.Movimientos
                         where c.idProductoCliente == idProductoCliente && c.TipoMovimiento == 4
                         select new
                         {
                             Detalle = c.Detalle,
                             ValorRendimiento = c.Debito - c.Credito,
                             FechaMovimiento = c.FechaMovimiento,
                         }).ToList();

                return new JavaScriptSerializer().Serialize(a);
            }
        }

        public void CalcularRendimientos(int idProductoCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                IQueryable<Movimiento> a = (from c in bd.Movimientos
                                            where c.idProductoCliente == idProductoCliente && c.TipoMovimiento == 4
                                            select c);

                if (a.Count() == 0)
                {
                    DateTime? finicio = (from c in bd.Movimientos
                                         where c.idProductoCliente == idProductoCliente
                                         select c.FechaMovimiento).Min();

                    if (finicio != null)
                    {
                        DateTime fecha = (DateTime)finicio;
                        while (fecha.Date < DateTime.Now.Date)
                        {
                            fecha = fecha.AddDays(1);
                            AdicionarRendimiento(idProductoCliente, 1, fecha);
                        }
                    }
                    //desde la fecha de creacion del producto adicionar dia a dia el rendimiento
                }
                else
                {

                    DateTime? finicio = (from c in bd.Movimientos
                                         where c.idProductoCliente == idProductoCliente && c.TipoMovimiento == 4
                                         select c.FechaMovimiento).Max();

                    if (finicio != null)
                    {
                        DateTime fecha = (DateTime)finicio;
                        while (fecha.Date < DateTime.Now.Date)
                        {
                            fecha = fecha.AddDays(1);
                            AdicionarRendimiento(idProductoCliente, 1, fecha);
                        }
                    }
                }
            }
        }

        /// <summary>
        /// adiciona rendimientos teniendo en cuenta la tasa de interes al moemtno de registrar el producto y el periodo que se envía
        /// </summary>
        /// <param name="idProductoCliente">identificador del proudcto del cliente</param>
        /// <param name="periodos">numero de periodos sobre los cuales se va a calcular rendimientos, normalmente 1</param>
        /// <param name="Fecha">Fecha en la cual se aplica el rendimiento</param>
        /// <returns></returns>
        //[WebMethod]
        //[ScriptMethod( ResponseFormat = ResponseFormat.Json )]
        public string AdicionarRendimiento(int idProductoCliente, int periodos, DateTime FechaRendimientos)
        {

            decimal saldo = SaldoProductoCliente(idProductoCliente);
            decimal interes;
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.ProductosClientes
                         where c.idProductoCliente == idProductoCliente
                         select c).Single();

                interes = (a.TasaInteres == null) ? 0 : (decimal)a.TasaInteres;
                decimal rendimiento = (saldo * (decimal)Math.Pow((double)(1 + interes), (double)periodos)) - saldo;

                Movimiento mov = new Movimiento();
                mov.FechaMovimiento = FechaRendimientos;
                mov.idProductoCliente = idProductoCliente;
                mov.TipoMovimiento = 4;
                mov.Detalle = "Rendimientos";
                mov.Debito = rendimiento;
                mov.Credito = 0;
                bd.Movimientos.AddObject(mov);
                bd.SaveChanges();
            }

            return "Sucess";
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetProductoClienteXid(int idProductoCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.ProductosClientes
                         where c.idProductoCliente == idProductoCliente
                         select new ProductoWS
                         {
                             IdProductoCliente = c.idProductoCliente,
                             NumeroDelProducto = c.NumeroDelProducto,
                             IdOficina = c.idOficina,
                             IdProducto = c.idProducto,
                             IdCliente = c.idCliente,
                             NombreProductoCliente = c.NombreProductoCliente,
                             TasaInteres = c.TasaInteres,
                             Periodos = c.Periodos,
                             TipoPeriodo = c.TipoPeriodo,
                             Descripcion = c.Producto.Descripcion,
                             NombreProducto = c.Producto.NombreProducto,
                             NombreTipoProducto = c.Producto.TipoProducto.TipoProducto1,
                             IdGrupoCliente = c.idGrupoCliente,
                             FechaCreacion = c.FechaCreacion,
                             FechaFin = EntityFunctions.AddMonths(c.FechaCreacion, c.Periodos),
                             SaldoD = (from r in bd.Movimientos
                                       where r.idProductoCliente == c.idProductoCliente
                                       group r by r.idProductoCliente into g
                                       select new
                                       {
                                           Saldo = g.Sum(k => k.Debito - k.Credito)
                                       }).FirstOrDefault().Saldo
                         }).Single();

                a.Saldo = a.SaldoD == null ? string.Empty : a.SaldoD.Value.ToString("#,##0.##");
                return new JavaScriptSerializer().Serialize(a);
            }
        }

        public decimal GetCupoDisponibleDecimal(int idProductoCliente)
        {
            decimal saldo = SaldoProductoCliente(idProductoCliente);
            decimal CupoDisponible = 0;

            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.ProductosClientes
                         where c.idProductoCliente == idProductoCliente
                         select c).Single();

                CupoDisponible = (a.valorAprobado == null) ? 0 : (decimal)a.valorAprobado;
                CupoDisponible = CupoDisponible + saldo;
            }
            return CupoDisponible;
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetCupoDisponible(int idProductoCliente)
        {
            return new JavaScriptSerializer().Serialize(GetCupoDisponibleDecimal(idProductoCliente));
        }

        public int GetDiasDeMoraIntero(int idProductoCliente)
        {



            decimal saldo = SaldoProductoCliente(idProductoCliente);
            decimal CupoDisponible = 0;
            decimal porcentajeLibre;
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.ProductosClientes
                         where c.idProductoCliente == idProductoCliente
                         select c).Single();

                if (a.Producto.idProducto < 9 || a.Producto.idProducto > 11)
                {
                    return 0;
                }

                decimal MontoAprobado = (a.valorAprobado == null) ? 0 : (decimal)a.valorAprobado;
                if (MontoAprobado == 0)
                {
                    return 0;
                }
                CupoDisponible = MontoAprobado + saldo;
                porcentajeLibre = CupoDisponible / MontoAprobado;
            }

            if (porcentajeLibre < (decimal)0.1)
            {
                Random r = new Random(DateTime.Now.Millisecond);
                int aleat2 = r.Next(0, 30);
                return aleat2;
            }
            else
            {
                return 0;
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetDiasDeMora(int idProductoCliente)
        {
            return new JavaScriptSerializer().Serialize(GetDiasDeMoraIntero(idProductoCliente));
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string UtilizarCredito(int idProductoCliente, decimal valor, string Detalle)
        {

            decimal saldo = SaldoProductoCliente(idProductoCliente);
            decimal CupoDisponible = 0;

            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.ProductosClientes
                         where c.idProductoCliente == idProductoCliente
                         select c).Single();

                CupoDisponible = (a.valorAprobado == null) ? 0 : (decimal)a.valorAprobado;
                CupoDisponible = CupoDisponible + saldo;

            }


            if (CupoDisponible > valor)
            {
                return new JavaScriptSerializer().Serialize(AddMovimiento(idProductoCliente, valor, "Utilización crédito - " + Detalle, -1, 10));
            }
            else
            {
                return new JavaScriptSerializer().Serialize("No tiene cupo suficiente");
            }
        }

        public decimal GetCuota(int idProductoCliente)
        {
            decimal Cinicial;
            decimal interes;
            int Periodos;

            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.ProductosClientes
                         where c.idProductoCliente == idProductoCliente
                         select c).Single();

                Cinicial = (a.valorAprobado == null) ? 0 : (decimal)a.valorAprobado;
                interes = (a.TasaInteres == null) ? 0 : (decimal)a.TasaInteres;
                Periodos = (a.Periodos == null) ? 0 : (int)a.Periodos;
                if (Periodos == 0 || Cinicial == 0)
                {
                    return 0;
                }
            }

            return Cinicial * ((interes * (decimal)(Math.Pow((double)(1 + interes), (double)Periodos))) / (((decimal)(Math.Pow((double)(1 + interes), (double)Periodos)) - 1)));
        }



        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetCuotaCredito(int idProductoCliente)
        {
            return new JavaScriptSerializer().Serialize(GetCuota(idProductoCliente));
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string CrearCreditoVivienda(int idCliente, int idOficina, decimal TasaInteres, int Periodos, decimal valor, string nombreProducto, Decimal ValorVivienda, Decimal ValorCuotaInicial)
        {
            int idProducto = 4;
            decimal valorEstimadoCI = ValorVivienda * (decimal)0.3;
            decimal valorEstimadoCredito = ValorVivienda * (decimal)0.7;
            if (valorEstimadoCI > ValorCuotaInicial)
            {
                return new JavaScriptSerializer().Serialize("La cuota incial debe ser de almenos el 30% del valor de la inmueble");
            }
            else
            {
                if (valorEstimadoCredito < valor)
                {
                    return new JavaScriptSerializer().Serialize("El valor solicitado no puede exceder el 70% del valor del inmueble");
                }
                else
                {
                    CrearProductoCliente(idCliente, idOficina, idProducto, TasaInteres, Periodos, valor, nombreProducto);
                    return "Success";
                }
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string CrearCreditoVehiculo(int idCliente, int idOficina, decimal TasaInteres, int Periodos, decimal valor, string nombreProducto, Decimal ValorVivienda, Decimal ValorCuotaInicial)
        {
            int idProducto = 5;
            decimal valorEstimadoCI = ValorVivienda * (decimal)0.1;
            decimal valorEstimadoCredito = ValorVivienda * (decimal)0.9;
            if (valorEstimadoCI < ValorCuotaInicial)
            {
                return new JavaScriptSerializer().Serialize("La cuota incial debe ser de almenos el 10% del valor del vehículo");
            }
            else
            {
                if (valorEstimadoCredito < valor)
                {
                    return new JavaScriptSerializer().Serialize("El valor solicitado no puede exceder el 90% del valor del vehículo");
                }
                else
                {
                    string respuesta = CrearProductoCliente(idCliente, idOficina, idProducto, TasaInteres, Periodos, valor, nombreProducto);
                    return respuesta;
                }
            }
        }

        public string ValidarCredito(int idProducto)
        {
            //si se solicita un producto se debe validad que 
            return "true";
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string getListaTiposFactura()
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.TipoFacturas
                         select c).ToList();

                return new JavaScriptSerializer().Serialize(a);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string InscribirFactura(int idCliente, int idTipoFactura, string NumeroFactura, string NombreFactura, string nombreEmpresa)
        {
            try
            {

                FacturasCliente fac = new FacturasCliente();
                fac.idCliente = idCliente;
                fac.idTipoFactura = idTipoFactura;
                fac.NumeroFactura = NumeroFactura;
                fac.NombreFactura = NombreFactura;
                fac.NombreEmpresa = nombreEmpresa;
                using (Banking_MSEntities bd = new Banking_MSEntities())
                {
                    bd.FacturasClientes.AddObject(fac);
                    bd.SaveChanges();
                    return new JavaScriptSerializer().Serialize(fac.idFacturaCliente);
                }
            }
            catch
            {
                return new JavaScriptSerializer().Serialize("Error");
            }
        }


        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string getListaFacturasInscritas(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                Random r = new Random();
                string valorApagar = ((r.NextDouble() * 200000) + 10000).ToString("#,##0.##");
                var a = (from c in bd.FacturasClientes
                         where c.idCliente == idCliente
                         select new
                         {
                             c.idFacturaCliente, c.idTipoFactura, c.NombreFactura, c.NumeroFactura, c.TipoFactura.TipoFactura1, c.UltimoValorPagado, c.FechaDePago, c.NumeroComprobantePago, ValorApagar = valorApagar
                         }).ToList();

                return new JavaScriptSerializer().Serialize(a);
            }

        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetListaFacturasAPagar(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                Random r = new Random();
                decimal valorApagar = (decimal)((r.NextDouble() * 200000) + 10000);
                var a = (from c in bd.FacturasClientes
                         where c.idCliente == idCliente
                         select new
                         {
                             c.idFacturaCliente, c.idTipoFactura, c.NombreFactura, c.NumeroFactura, c.TipoFactura.TipoFactura1, c.UltimoValorPagado, c.FechaDePago, c.NumeroComprobantePago, ValorAPagar = valorApagar
                         }).ToList();
                a = a.Where(t => t.FechaDePago == null || t.FechaDePago.Value.Date != DateTime.Now.Date).ToList();
                return new JavaScriptSerializer().Serialize(a);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string getFacturaAPagar(int idFacturaCliente)
        {

            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                Random r = new Random();

                decimal valorApagar = (decimal)((r.NextDouble() * 200000) + 10000);
                var a = (from c in bd.FacturasClientes
                         where c.idFacturaCliente == idFacturaCliente
                         select new
                         {
                             c.idFacturaCliente, c.idTipoFactura, c.NombreFactura, c.NumeroFactura, c.TipoFactura.TipoFactura1, Valor = valorApagar, fechaVencimiento = DateTime.Now.ToShortDateString()
                         }).Single();

                return new JavaScriptSerializer().Serialize(a);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string PagarFactura(int idFacturaCliente, decimal valorApagar, int idProductoCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                string respuesta = "No se pudo realizar la operación";

                var a = (from c in bd.FacturasClientes
                         where c.idFacturaCliente == idFacturaCliente
                         select c).Single();

                bool estado = Retirar(idProductoCliente, valorApagar, "Pago de factura de " + a.TipoFactura.TipoFactura1 + " número " + a.NumeroFactura, out respuesta, 11);
                if (estado == false)
                {
                    return new JavaScriptSerializer().Serialize(respuesta);
                }
                else
                {
                    a.UltimoValorPagado = valorApagar;
                    a.FechaDePago = DateTime.Now;
                    a.NumeroComprobantePago = idFacturaCliente.ToString() + DateTime.Now.Millisecond.ToString();
                    bd.SaveChanges();
                    return new JavaScriptSerializer().Serialize("Success");
                }
            }
        }

        static void GetListaProductos()
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.Productos
                         select c);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetDisponibilidadProductos(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = from c in bd.ListaProductoDisponibles(idCliente)
                        select new
                        {
                            c.IdProducto,
                            c.TieneProducto,
                            Disponible = Convert.ToInt32(c.Disponible),
                            c.NombreProducto
                        };

                return new JavaScriptSerializer().Serialize(a);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetProductosCliente(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = from c in bd.ProductosClientes
                        where c.idCliente == idCliente
                        select new
                        {
                            IdProducto = c.idProducto,
                            c.idProductoCliente,
                            c.NombreProductoCliente
                        };

                return new JavaScriptSerializer().Serialize(a);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetInteresesProducto(int idProducto)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = from c in bd.InteresesProductoes
                        where c.IdProducto == idProducto
                        select new
                        {
                            c.IdInteresesProducto, c.IdProducto, c.Periodo, c.Valor
                        };

                return new JavaScriptSerializer().Serialize(a.OrderBy(t => t.Periodo));
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetCreditosAPagar(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.ProductosClientes
                         where c.idCliente == idCliente && c.Producto.idTipoProducto == 1 && (c.Producto.idProducto > 11 || c.Producto.idProducto < 8)
                         select new
                         {
                             c.Producto.NombreProducto, c.idCliente, c.idProductoCliente, c.NombreProductoCliente, FechaUltimoPago = c.Movimientos.Max(x => x.FechaMovimiento)
                         }).ToList();
                return new JavaScriptSerializer().Serialize(a);
            }
        }

        public void PagarCredito(int idProductoCliente, DateTime FechaPago, decimal valor)
        {
            string rta = AddMovimiento(idProductoCliente, valor, "Pago cuota crédito", 1, 10, FechaPago);
        }

        public void PagarCoutasCredito(int idProductoCliente)
        {
            decimal valor = GetCuota(idProductoCliente);

            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                IQueryable<Movimiento> a = (from c in bd.Movimientos
                                            where c.idProductoCliente == idProductoCliente && c.TipoMovimiento == 10
                                            select c);

                if (a.Count() == 0)
                {
                    DateTime? finicio = (from c in bd.Movimientos
                                         where c.idProductoCliente == idProductoCliente
                                         select c.FechaMovimiento).Min();

                    if (finicio != null)
                    {
                        DateTime fecha = (DateTime)finicio;
                        fecha = fecha.AddDays(1);
                        while (fecha.Date < DateTime.Now.Date)
                        {
                            PagarCredito(idProductoCliente, fecha, valor);
                            fecha = fecha.AddDays(1);
                        }
                    }
                    //desde la fecha de creacion del producto adicionar dia a dia el pago de la cuota
                }
                else
                {

                    DateTime? finicio = (from c in bd.Movimientos
                                         where c.idProductoCliente == idProductoCliente && c.TipoMovimiento == 10
                                         select c.FechaMovimiento).Max();

                    if (finicio != null)
                    {
                        DateTime fecha = (DateTime)finicio;
                        fecha = fecha.AddDays(1);
                        while (fecha.Date < DateTime.Now.Date)
                        {
                            PagarCredito(idProductoCliente, fecha, valor);
                            fecha = fecha.AddDays(1);
                        }
                    }
                }
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string PagarCreditoConTransferencia(int idProductoCliente, int idProductoClienteADescontar, decimal valor)
        {
            string Respuesta;
            bool estado = Retirar(idProductoClienteADescontar, valor, "Retiro por transferencia", out Respuesta, 9);
            if (estado == true)
            {
                Respuesta = AddMovimiento(idProductoCliente, valor, "Pago cuota crédito", 1, 10, DateTime.Now);
            }
            return new JavaScriptSerializer().Serialize(Respuesta);
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string Crear(int idProductoCliente, int idProductoClienteADescontar, DateTime FechaPago, decimal valor)
        {
            string Respuesta;
            bool estado = Retirar(idProductoClienteADescontar, valor, "Retiro por transferencia", out Respuesta, 9);
            if (estado == true)
            {
                Respuesta = AddMovimiento(idProductoCliente, valor, "Pago cuota crédito", 1, 10, FechaPago);
            }
            return new JavaScriptSerializer().Serialize(Respuesta);
        }


        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string CrearDashboardCliente(int idCliente, string coordX, string coordY, int idProductoCliente, string TipoCuenta)
        {
            ConfiguracionDashboard conf = new ConfiguracionDashboard();
            conf.idCliente = idCliente;
            conf.CoordX = coordX;
            conf.CoordY = coordY;
            conf.idProductoCliente = idProductoCliente;
            conf.TipoCuenta = TipoCuenta;
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                bd.ConfiguracionDashboards.AddObject(conf);
                bd.SaveChanges();
            }
            return new JavaScriptSerializer().Serialize(conf.idDashBoard.ToString());
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetDashboardCliente(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = from c in bd.ConfiguracionDashboards
                        where c.idCliente == idCliente
                        select c;
                return new JavaScriptSerializer().Serialize(a);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetDashboardClienteByTipoCuenta(int idCliente, string tipoCuenta)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = from c in bd.ConfiguracionDashboards
                        where c.idCliente == idCliente && c.TipoCuenta == tipoCuenta
                        select new
                        {
                            c.CoordX, c.CoordY, c.idDashBoard, c.idProductoCliente
                        };
                return new JavaScriptSerializer().Serialize(a);
            }
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string DeleteDashboardCliente(int idProductoCliente, string tipoCuenta)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                try
                {
                    var a = (from c in bd.ConfiguracionDashboards
                             where c.idProductoCliente == idProductoCliente && c.TipoCuenta == tipoCuenta
                             select c).Single();

                    bd.ConfiguracionDashboards.DeleteObject(a);
                    bd.SaveChanges();

                    return new JavaScriptSerializer().Serialize("Success");
                }
                catch (Exception e)
                {
                    return new JavaScriptSerializer().Serialize(e.Message);
                }
            }
        }


        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string SimularCredito(Decimal ValorPrestamo, Decimal interes, int Periodos)
        {
            decimal Cinicial = ValorPrestamo;
            decimal cuota;
            cuota = Cinicial * ((interes * (decimal)(Math.Pow((double)(1 + interes), (double)Periodos))) / (((decimal)(Math.Pow((double)(1 + interes), (double)Periodos)) - 1)));
            List<CuotasCredito> coutas = new List<CuotasCredito>();

            for (int i = 1; i <= Periodos; i++)
            {
                CuotasCredito Lacouta = new CuotasCredito();
                Lacouta.couta = cuota;
                Lacouta.periodo = i;
                Lacouta.Tasainteres = interes;
                Lacouta.coutaAcumulada = i * cuota;
                coutas.Add(Lacouta);
            }
            return new JavaScriptSerializer().Serialize(coutas);
        }

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetResumenPagosVencer(int idCliente)
        {
            using (Banking_MSEntities bd = new Banking_MSEntities())
            {
                var a = (from c in bd.FacturasClientes
                         where c.idCliente == idCliente
                         select new PagosVences
                         {
                             NombreProductoCliente = c.NombreFactura,
                             IdProducto = c.idTipoFactura,
                             FechaUltimoPago = c.FechaDePago,
                             Tipo = 1
                         }).ToList();

                var productos = (from c in bd.ProductosClientes
                                 where c.idCliente == idCliente && c.Producto.TipoProducto.idTipoProducto == 1
                                 select new PagosVences
                                 {
                                     NombreProductoCliente = c.NombreProductoCliente,
                                     IdProducto = c.idProducto,
                                     FechaUltimoPago = c.Movimientos.Max(x => x.FechaMovimiento),
                                     Tipo = 2
                                 }).ToList();

                a.InsertRange(0, productos);

                return new JavaScriptSerializer().Serialize(a.Where(t => t.FechaUltimoPago == null || t.FechaUltimoPago.Value.Date != DateTime.Now.Date).OrderBy(t => t.FechaUltimoPago).Take(2));
            }
        }
    }

    public class PagosVences
    {
        public string NombreProductoCliente
        {
            get;
            set;
        }
        public DateTime? FechaUltimoPago
        {
            get;
            set;
        }

        public int IdProducto
        {
            get;
            set;
        }

        public int Tipo
        {
            get;
            set;
        }
    }

    public class CuotasCredito
    {
        public int periodo { get; set; }
        public decimal couta { get; set; }
        public decimal Tasainteres { get; set; }
        public decimal coutaAcumulada { get; set; }
    }
}